import { _decorator, Component, director, EventTarget, log, Node, Prefab, SpriteFrame, Sprite } from 'cc';
import { Enum_Player, Enum_resourcesPrefab } from './Enum';
import { ResourcesUtil } from './ResourcesUtil';
import { NodePoolManager } from './NodePoolManager';
import { Start } from './Start';
import StorageManager from './Data/StorageManager';
const { ccclass, property } = _decorator;
(window as any).GlobalEventTarget = new EventTarget(); // 全局事件(监听发射事件用)
// 全局常驻节点
@ccclass('Globals')
export class Globals extends Component {

    @property(Node) frameNode: Node = null;

    static prefabs: Record<string, Prefab> = {};

    protected onLoad(): void {
        // 常驻节点
        director.addPersistRootNode(this.node);
    }

    start() {
        // ResourcesUtil.loadSpriteFrame(`Frame/Player/attack_gun/attack_gun_00/spriteFrame`).then((spriteFrame: SpriteFrame) => {
        //     this.frameNode.getComponent(Sprite).spriteFrame = spriteFrame;
        // })
    }

    update(deltaTime: number) {

    }

    // 开始游戏时，加载prefab，读取数据
    static init() {
        // 需要动态加载的预制体加载完成后，再调用 开始游戏
        const prefabPromises: Promise<any>[] = []; //存放所有动态加载后的预制体返回的Promise
        // 拿到key值然后遍历
        Object.keys(Enum_resourcesPrefab).forEach(key => {
            // 通过key值，拿到prefab的路径值，然后加载出来,再缓存起来
            const promiseItem = ResourcesUtil.loadPrefabs(Enum_resourcesPrefab[key]).then((prefab: Prefab) => {
                // 加载好的prefab缓存起来
                Globals.prefabs[key] = prefab;
            });
            prefabPromises.push(promiseItem); //把每个加载后的promise存入
        })
        return Promise.all(prefabPromises);
    }
    // 节点对象池拿取节点
    /**
     * 节点对象池拿取节点
     * @param name 节点名称（prefab名字）
     * @param parent 节点的父节点
     * @returns 此节点
     */
    static getNode(name: string, parent: Node) {
        const node = NodePoolManager.instance.get(this.prefabs[name]);
        if (node) {
            node.parent = parent;
        }
        return node;
    }
    // 向对象池添加节点，会把节点从父节点删除，然后添加到对象池（相当于界面删除）
    /**
     * 向对象池添加节点，会把节点从父节点删除，然后添加到对象池（相当于从界面删除）
     * @param node 节点
     */
    static putNode(node: Node) {
        NodePoolManager.instance.put(node);
    }

    static getPrefab(name) {
        return this.prefabs[name];
    }

}


